การใช้ Lambda Function เพื่อแปลงข้อมูลใน Firehose
ขั้นตอนการทำ
สร้าง Amazon S3 Bucket
อันดับแรกสิ่งที่เราต้องมีคือ S3 Bucket นะครับเหมือนกับบล็อกก่อนหน้านี้เลยเพื่อใช้เป็นพื้นที่ในการเก็บข้อมูลเพื่อนำมาแสดงใน Kinesis Firehose ครับ โดยผมจะกำหนดชื่อ S3 Bucket ตามตัวอย่างด้านล่างนี้นะครับ
AS3 Bucket name: chawish-test-[date]
และสำหรับขั้นตอนและวิธีการสร้าง S3 Bucket นะครับสามารถดูได้จากลิ้งค์ด้านล่างเลยครับ
เมื่อเราสร้าง S3 Bucket เรียบร้อยแล้วอันดับต่อไปเราก็จะสร้างและใช้งาน Kinesis Firehose กันครับ
Kinesis Firehose
เมื่อเข้าสู่หน้าแรกของ Kinesis Firehose ให้เราเลือกหัวข้อ Kinisis Data Firehose ที่อยู่มุมขวานะครับและกดปุ่ม Create delivery stream ครับตามรูปด้านล่างเลยครับ
เมื่อกดเข้าไปแล้วในส่วนนี้ให้เรากำหนด Source และ Destination พร้อมกับตั้งชื่อ Delivery ที่เราต้องการนะครับโดยเลือกข้อมูลตามนี้ครับ
Source:Direct PUT
Destination:Amazon S3
Delivery stream name:chawish-test-[date]
หลังจากนั้นให้เราเลื่อนลงมาในส่วนของ Destination settings แล้วกด Browse ครับและเลือก S3 Bucket ของเราที่ทำการสร้างไปก่อนหน้านี้มาใช้งานครับ
ถัดไปให้เลื่อนลงมาในหัวข้อ Buffer hints, compression and encryption นะครับ กดที่หัวข้อเพื่อให้ระบบแสดงข้อมูลมาเพิ่มเติมและเปลี่ยนแปลงข้อมูลของ Buffer interval เป็น 60 นะครับ ก็คือกำหนดให้มีการอัพเดททุกๆ 60 วินาทีครับ
จากนั้นก็กดปุ่ม Create delivery stream ได้เลยครับ และในขั้นตอนต่อไปเราจะทำการสร้าง Lambda function กันครับ
AWS Lambda
เริ่มต้นให้เราเข้าไปที่หน้าแรกของเซอร์วิส AWS Lambda นะครับจากนั้นให้เราสังเกตที่หัวข้อมุมขวาชื่อว่า Function นะครับให้เราคลิ้กเข้าไปที่หัวข้อนี้จากนั้นคลิ้กปุ่ม Create function ด้านขวามือเพื่อทำการสร้าง function มาใช้งานกันครับ
ตามด้วยตั้งค่าข้อมูลเพื่อใช้งานนะครับโดยเราจะเลือกเป็น Author from scratchและกรอกข้อมูลลงไปตามนี้ครับ
Function name:chawish-test-[date]
Runtime:Python 3.9
เมื่อกรอกข้อมูลทั้งหมดเสร็จก็เลื่อนลงมาข้างล่างและกดปุ่ม Create function ได้เลยครับ
หลังจากนั้นระบบจะแสดงหน้านี้ขึ้นมาเพื่อยืนยันว่าเราได้สร้าง Function สำเร็จเป็นที่เรียบร้อยแล้ว
และในส่วนถัดไปเราจะเขียนฟังก์ชันแปลงข้อมูลวันที่และเวลาลงไปใน Lambda ครับซึ่งตัวโปรแกรมผมได้ทำการสร้างไว้เรียบร้อยแล้ว สามารถโหลดมาใช้งานได้ตามลิ้งด้านล่างนี้เลยครับ
จากนั้นให้เราคัดลอกโค้ดทั้งหมดมาใส่ในช่องด้านล่างของหน้า Lambda function ของเรา
หลังจากนั้นก็กดปุ่ม Deploy นะครับ เพื่อทำการอัพเดท Function ใน Lambda ครับ
หลังจากนั้นให้เราไปที่หัวข้อ Configuration นะครับเพื่อแก้ไขเวลา Timeout
เมื่อเข้ามาแล้ว เลื่อนลงมาดูข้อมูลด้านล่างและเปลี่ยนแปลงข้อมูลในหัวข้อ Timeout ให้เป็น 1 นาที นะครับ
และในขั้นตอนถัดไปเราจะมาทดสอบโค้ดที่เรานำมาใส่นะครับ ว่าสามารถใช้งานได้หรือไม่โดยไปที่หัวข้อ Test ครับ
เมื่อเราเข้ามาให้ส่วน Test แล้วให้เราเลื่อนลงมาด้านล่างเพื่อใส่โค้ด JSON ด้านล่างมาใส่ลงไปตามภาพนะครับ
{ "records": [] }
จากนั้นให้เราเลื่อนขึ้นมากดปุ่ม Run ได้เลยครับเพื่อทำการทดสอบความถูกต้องของโค้ดว่าสามารถใช้งานได้หรือไม่
ถ้าโค้ดหรือโปรแกรมทำงานได้ปกติไม่มีปัญหาอะไร ระบบก็จะขึ้นข้อความตามภาพนี้นะครับ
ก็จบการตั้งค่าในส่วนของ AWS Lambda แล้วนะครับ อันดับต่อไปก็จะเป็นการสร้าง IAM Role กันครับผม
AWS IAM
ในส่ส่วนนี้เราจะทำการสร้าง Role เพื่อใช้งานกับ EC2 ครับ โดยจะเป็นการกำนหดสิทธิ์สูงสุดในกับ EC2 เพื่อใช้งาน Firehose นั้นเองโดยเนื้อหาและขั้นตอนสามารถดูได้จากบล็อกที่ผมเขียนก่อนหน้านี้ด้านล่างได้เลยครับ
Trsusted entity type: AWS Service
Use case: EC2
Permission Policy: AmazonKinesisFirehoseFullAccess
Role name: ec2-chawish-test-20220810
Amazon EC2
ทำการติดตั้ง EC2 Instance สำหรับใช้ในการเชื่อมต่อกับ Firehose โดยทำตามลิงก์ด้านล่างนี้ครับ
จะมีส่วนของหัวข้อ Advanced details ที่เราต้องตั้งค่าเองนะครับไม่มีเนื้อหาในลิ้งค์ด้านล่าง ให้เราเลื่อนลงไปดูวิธีการตั้งค่าด้านล่างของบล็อกนะครับเมื่อทำถึงส่วนนี้แล้ว
- ※ตัวอย่างตั้งค่าการสร้าง EC2 Instance ในบทความนี้
Create Key pairs
Key pairs:
chawish-test-[date]
Launch instances
Name and tags
Name:
chawish-test-[date]
Application and OS Images (Amazon Machine Image)
Amazon Machine Image (AMI):
Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type
(Default)Instance type
Instance type:
t3a.nano
Key pair (login)
Key pair name - required:
chawish-test-[date]
Network settings
Firewall (security groups)
Security group name - required:
chawish-test-[date]
Description - required:chawish-test-[date]
Inbound security groups rules
Security group rule 1 (TCP, 22, 0.0.0.0/0)
Type:
ssh ▼
| Source type:My IP ▼
| Source:xxx.xxx.x.xxx/32 ✕
Configure storage
1x:
8
GiBgp2 ▼
Root volume (Default)Advanced details
! หลังจากนี้จะเป็นเนื้อหาที่เพิ่มเติมจากการตั้งค่าตามลิ้งค์ด้านบนนะครับIAM Instance profile: เลือก IAM Role ที่เราสร้างก่อนหน้านี้
เมื่อเราสร้าง Instance เสร็จแล้วอันดับต่อไปก็จะเป็นเกี่ยวกับการรันคำสั่งในโปรแกรม Putty นะครับขั้นตอนต่อไปเราจะมาดูในส่วนของการตั้งค่าเซิร์ฟเวอร์ผ่าน Putty นะครับ
Putty
ในส่วนของการใช้งานและตั้งค่าเซิร์ฟเวอร์นะครับ ผมได้เขียนขั้นตอนและวิธีการใช้งานในบล็อกก่อนหน้านี้แล้ว สามารถเข้าไปดูรายละเอียดตามลิ้งค์ด้้านล่างได้เลยครับ
การส่งข้อมูลไปยัง Firehose
เริ่มต้นให้เราพิมพ์คำสั่ง
wget https://raw.githubusercontent.com/classmethod-thailand/cmth_seminar/develop/iot_core_webinar/create_sample_json_to_firehose1.py
เพื่อ Upload โค้ด Python ที่ผมสร้างไว้ลงไปยังเซิร์ฟเวอร์ครับตามรูปด้านล่างเลย
ตามด้วยคำสั่งสร้างไฟล์ Python นะครับคือ
chmod 777 create_sample_json_to_firehose1.py
และหลังจากนั้นให้เราเข้าไปแก้ไขไฟล์นั้นนะครับโดยใช้คำสั่ง
vi create_sample_json_to_firehose1.py
เมื่อเข้ามาในไฟล์แล้วให้เราแก้ไขชื่อ firehose_stream_name ให้เป็นชื่อของ Firehose ที่เราสร้างนะครับวิธีการคือให้เรากด
i
ครับ เป็นการปรับโหมดเป็น insert mode ข้อมูลซึ่งในโหมดนี้เราสามารถทำการแก้ไขข้อมูลในไฟล์นั้นได้ครับตามตัวอย่างของผมก็จะเป็น
firehose_stream_name = "chawish-test-[date]"
เมื่อแก้ไขเสร็จก็กด esc
เพื่อออกจากโหมด insert mode ตามด้วยพิมพ์คำสั่ง :x
เพื่อทำการบันทึกข้อมูลที่แก้ไขและออกจากไฟล์ครับ
ขั้นตอนต่อไปก็ให้เราทำาการ Upload ไฟล์นี้ลงไปยัง Amazon S3 โดยใช้คำสั่ง
python3 create_sample_json_to_firehose1.py
หลังจากที่เรารันคำสั่งเสร็จก็ให้รอ 60 วินาทีตามที่ได้ตั้งค่า Buffer interval ไว้ แล้วกลับไปตรวจดูที่ S3 Bucket ของเราว่าระบบมีการสร้างไฟล์อะไรขึ้นมาหรือไม่ ซึ่งถ้าเราทำถูกต้องทุกขั้นตอนระบบก็จะมีการสร้างไฟล์และโฟลเดอร์ขึ้นมาตามวันและเวลา ณ ปัจจุบันนั้น ตามตัวอย่างในรูปนะครับ
ถ้าเราทำตามขั้นตอนมาถึงช่วงนี้ ทุกท่านจะได้ผลลัพธ์ในรูปแบบนี้ถูกต้องไหมครับ ซึ่งถ้าเราสังเกตดีๆ ในส่วนของ timestamp ตัวเลขเวลาจะเป็นจุดทศนิยมถูกไหมครับ ซึ่งเราไม่สามารถอ่านค่าได้เลยว่าเป็นวันที่เวลาเท่าไหร่
ทำให้เราจำเป็นที่จะต้องนำฟังก์ชั่นที่เราเขียนไว้ใน Lambda มาใช้งานครับ เพื่อแปลงข้อมูลทศนิยมของ timestamp ให้เป็นข้อมูลที่เราสามารถเข้าใจได้ครับ
การเปิดใช้งาน Lambda function และ ผลลัพธ์ที่ถูกต้อง
ขั้นตอนนี้ให้เรากลับไปที่ Amazon Kinisis Firehose ของเราก่อนนะครับและเลือกดูที่หัวข้อ Configuration นะครับ ตามด้วยกด Edit
จากนั้นให้ตั้งค่าข้อมูลตามนี้นะครับเพื่อเปิดใช้งานฟังก์ชันที่เราสร้างใน Lambda
Data transformation: Enabled
AWS Lambda function: chawish-test-[date] (เลือก Lambda function ที่เราสร้างไปก่อนหน้านี้ครับ)
จากนั้นก็กดปุ่ม Save change ได้เลยครับ
และเมื่อเราเปิดใช้งานฟังก์ชั่น Lambda เรียบร้อยแล้วเราก็จะมาทดสอบการ Upload ข้อมูลกันว่าตอนนี้ข้อมูล Timestamp ถูกเปลี่ยนแปลงรึยังโดยใช้คำสั่ง
python3 create_sample_json_to_firehose1.py
หลังจากรันคำสั่งเสร็จและระบบ Upload ข้อมูลใหม่ลงใน Amazon S3 เรียบร้อยแล้วให้เราดาวน์โหลดไฟล์ใหม่มาเปิดดูก็จะพบว่าข้อมูล Timestamp จากก่อนหน้านี้ที่เป็นทศนิยมได้หายไปแล้วและกลายเป็นรูปแบบของวันที่และเวลาที่เราสามารถเข้าใจได้ครับตามภาพที่เห็น
นี้คือผลลัพธ์ของการใช้งานฟังก์ชัน Lambda ที่เราเขียนนะครับทำให้แปลงข้อมูล Timestamp ออกมาในรูปแบบปกติได้ครับ
การ Delete และ Terminate เมื่อเลิกใช้งาน
ในส่วนนี้ของ EC2 ให้ทำตามลิ้งค์ด้านล่างนี้ได้เลยครับ
และในส่วนของ Firehose กับ S3 Bucket สามารถดูขั้นตอนได้จากบล็อกของผมก่อนหน้านี้ได้เลยครับตามลิ้งค์ด้านล่าง
และสุดท้ายจะเป็นการลบฟังก์ชั่น Lambda นะครับ ให้เราเข้าไปที่หน้า Function และเลือกฟังก์ชั่นที่เราสร้างขึ้นตามด้วยกด Action -> Delete ครับผม เพียงเท่านี้เราก็ทำการลบฟังก์ชั่น Lambda เรียบร้อยแล้ว
สรุป
สำหรับเนื้อหาในบล็อกครั้งนี้ผมหวังเป็นอย่างยิ่งว่าจะมีส่วนช่วยในการให้ความรู้และวิธีการใช้งาน Lanbda Function เพิ่มมากขึ้นนะครับ และในอนาคตข้างหน้าผมก็จะเขียนบล็อกให้ความรู้เกี่ยวกับเซอร์วิสของ AWS ต่อไปเรื่อยๆ เพื่อเป็นการเพิ่มประสบการณ์และทักษะในการใช้งาน AWS ให้มากยิ่งขึ้นครับ